package com.atguigu.day4;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

class MyThread implements Callable<Integer> {

    @Override
    public Integer call() throws Exception {
        System.out.println("========>come in ");
        return 1024;
    }
}

public class FutureTaskDemo {
    /*
     * 在主线程需要执行比较耗时的操作时，但又不想阻塞主线程，可以把这些作业交给Future对象在后台完成
     * 当主线程将来需要时，就可以通过Future对象获取后台作业的计算结果或者执行状态
     *
     * 一般FutureTask多用于耗时的计算，主线程可以在完成自己的任务后，再去获取结果。
     *
     * 仅在计算完成时才能检索结果；如果计算尚未完成，则阻塞get方法。一旦计算完成，
     * 就不能再重新开始或取消计算，get方法而获取结果只有在计算完成时获取，否则会一直阻塞
     * 直到任务转入完成状态，然后会返回结果或者抛出异常
     *
     * 只计算一次
     * get方法放到最后
     *
     *
     *
     * */
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        FutureTask<Integer> integerFutureTask = new FutureTask<>(myThread);
        new Thread(integerFutureTask, "t1").start();

        System.out.println("main-----over");
        try {
            System.out.println(integerFutureTask.get());
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        } catch (ExecutionException e) {
            throw new RuntimeException(e);
        }

    }
}
